﻿<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<script type="text/javascript" src="flow.js"></script>
<script type="text/javascript">

function $(id){return document.getElementById(id);}

function log(msg){$("out").innerHTML+=msg+"<br>";}

function f1(){log("f1 called");}
function f2(){log("f2 called");}
function f3(){log("f3 called");}

var TestService = {
	GetSum: function(x, y, onload){
		var res = x+y;
		setTimeout(function(){
			onload(res);
		}, 200);
	}
};

function init(){with(Flow){

	// Элементами потока может быть просто функция, либо Sequence, либо Parallel
	// Продолжение (Continuation) должна создаваться в главной функции элемента потока

	new Sequence(
		function(){f1(); setTimeout(new Continuation(), 1000);},
		function(){
			f2();
			setTimeout(new Continuation(), 500);
		},
		function(){
			log("TestService GetSum requested...");
			var cont = new Continuation(); // создаем продолжение в главной функции элемента потока
			TestService.GetSum(3, 2, function(res){
				log("TestService GetSum result: "+res);
				cont(); // Здесь создавать продолжение нельзя. Следует приготовить его заранее.
			});
		},
		function(){f3(); setTimeout(new Continuation(), 300);},
		
		new Sequence(
			function(){
				var cont = new Continuation("inner 1");
				log("Inner sequence begin");
				setTimeout(cont, 500);
			},
			function(){
				log("TestService GetSum requested...");
				var cont = new Continuation("inner 2");
				TestService.GetSum(3, 8, function(res){
					log("TestService GetSum result: "+res);
					cont();
				});
			},
			function(){log("Inner sequence calculation end"); (new Continuation())();},
			function(){log("Inner sequence end"); (new Continuation())();}			
		),
		
		function(){
			log("-----------------------------------------");
			var delay = 3000;
			log("before parallel: " + delay);
			setTimeout(new Continuation(), delay);
		},
		
		new Parallel(
			function(){
				var nr = 1;
				log("run "+nr);
				var cont = new Continuation();
				setTimeout(function(){
					log("end "+nr);
					cont();
				}, 100);
			},
			function(){
				var nr = 2;
				log("run "+nr);
				var cont = new Continuation();
				setTimeout(function(){
					log("end "+nr);
					cont();
				}, 2000);
			},
			function(){
				var nr = 3;
				log("run "+nr);
				var cont = new Continuation();
				setTimeout(function(){
					log("end "+nr);
					cont();
				}, 300);
			}
		),
		
		function(){
			log("after parallel");
			log("-----------------------------------------");
			setTimeout(new Continuation(), 300);
		},
		
		function(){log("END OF MAIN SEQUENCE REACHED")}
	).run();
	
}}	
</script>
</head>
<body onload="init()">
	<h1>Flow sample</h1>
	<div id="out"></div>
</body>
</html>